export {}

// 1.函数设置类型
/**
 * js中函数存在的缺点：
 * 1）实参和形参个数可以不一致
 * 2）对参数的类型没有约束
 */
// 1.1函数的参数必须设置类型
function sum(num1: number, num2: number): number {
  return num1 + num2
}
sum(100, 200)
// 1.2函数的返回值可以不加类型，Ts的类型推导会推出返回值的类型
function getIndex(arr: number[], value: number) {
  return arr.findIndex((item) => item === value)
}
getIndex([1, 4, 5, 7, 9], 3)
// 1.3函数表达式
// 登录函数，参数：用户名/密码，返回值：布尔值
const loginFn = (userName: string, password: string): boolean => {
  if (userName === 'admin' && password === '123456') {
    return true
  } else {
    return false
  }
}
loginFn('admin', '123456')

type LoginFunc = (userName: string, password: string) => boolean
const loginFn2: LoginFunc = (userName, password) => {
  if (userName === 'admin' && password === '123456') {
    return true
  } else {
    return false
  }
}
loginFn2('admin', '123456')
// 1.4 可选参数
function buildName(firstName: string, lastName?: string) {
  if (lastName) {
    return `${firstName}·${lastName}`
  } else {
    return firstName
  }
}
buildName('勒布朗', '詹姆斯')
buildName('刘德华')

// 1.5 无返回值
// 在js中, 一个函数没有返回值, 输出是: undefined
// 在ts中, undefined是一种明确的类型, 如果函数的返回值类型是 undefined, 那么函数必须返回 undefined
// 在提示中, 如果函数没有返回值, 那么函数的返回值类型是void
function eachArr(arr: string[]): void {
  arr.forEach((item) => {
    console.log(item)
  })
}
eachArr(['张飒', '李四'])

// 小练习
function arr2Str(arr: Array<string | number>, separator: string = ',') {
  return arr.join(separator)
}

console.log(arr2Str([1, 2, 4], '&'))
console.log(arr2Str([1, 2, 4], '-'))
console.log(arr2Str(['1', 3, '666']))
